函式包函式,並且在子函式中調用父函式的變數,避免父函式的變數在沒有任何參照的情況下被釋放掉。
講的好像很困難,我們直接來看範例比較快
function storeMoney() {
var money = 1000;
return function (price) {
money = money + price;
return money;
}
}
console.log(storeMoney());
console.log(storeMoney()(100));
如果是這樣的話,下面兩個 console.log 會印出甚麼呢?
第一個印出的是我們 return 的匿名函式,也就是說 storeMoney() 變成一個表達式,他回傳的值式我們定義的 匿名函式。
而第二個我們再透過(),並傳入數字去執行剛剛定義的 匿名函式 執行了 1000 + 傳入的數字後,他會再把總和回傳回來,所以得到 1100的結果。
這樣的狀況就稱為閉包。
然而閉包還有一個常見的應用如下
function storeMoney() {
var money = 1000;
return function (price) {
money = money + price;
return money;
}
}
var odinMoney = storeMoney();
console.log(odinMoney(100)); // 1100
console.log(odinMoney(100)); // 1200
console.log(odinMoney(100)); // 1300
會造成這樣累加的結果是因為父元素的 money 變數沒有消失,一直被子函式給參照著,所以金額就不斷地累加上去。
更特別的是下面這個狀況
function storeMoney() {
var money = 1000;
return function (price) {
money = money + price;
return money;
}
}
var odinMoney = storeMoney();
console.log(odinMoney(100)); // 1100
console.log(odinMoney(100)); // 1200
console.log(odinMoney(100)); // 1300
var jayMoney = storeMoney();
console.log(jayMoney(1000)); // 2000
console.log(jayMoney(1000)); // 3000
console.log(jayMoney(1000)); // 4000
如果重新宣告一個變數,他還可以同時分別累積不同的金額。
很神奇吧!
以上就是閉包的簡單介紹,詳細的介紹在下一篇文章
希望對各位有幫助,汪汪!